package database

import (
	"fmt"
	"strings"

	"gitee.com/sansaniot/ssiot-core/facade/env"
	"gitee.com/sansaniot/ssiot-core/logger"

	"ssdevice/common/constant"
	"ssdevice/common/utils"
	"ssdevice/internal/device/models"
)

// 仅创建、AutoMigrate会修改已存在表字段类型(-- 写好新增表的标签信息 --)
func Migrate() {
	db := env.Db
	if db == nil {
		return
	}
	if !db.Migrator().HasColumn(&models.SysDevConfig{}, "schema") {
		devConfigM := &models.SysDevConfig{}
		// 加config schema列
		if err := db.Migrator().AddColumn(devConfigM, "schema"); err == nil {
			// 自动补充schema值
			devConfigM.Orm = db
			configList := make([]models.SysDevConfig, 0)
			if err = devConfigM.FindList(&configList); err != nil {
				logger.Error(err)
				return
			}
			sql := "UPDATE sys_dev_config SET schema = tmp.schema FROM (VALUES %s) as tmp (id, schema) where sys_dev_config.id = tmp.id"
			valueSql := make([]string, 0)
			for _, config := range configList {
				valueSql = append(valueSql, "('"+config.Id+"', '"+string(utils.MapToBytes(utils.GetObjectSchema(utils.BytesToMap(config.Data))["properties"].(map[string]interface{})))+"'::jsonb)")
			}
			sql = fmt.Sprintf(sql, strings.Join(valueSql, ","))
			if err = db.Raw(sql).Scan(devConfigM).Error; err != nil {
				logger.Error(err)
			}
		} else {
			logger.Error(err)
		}
	}
	if !db.Migrator().HasTable(&models.SysDevFunc{}) {
		devFuncM := &models.SysDevFunc{}
		if err := db.Migrator().CreateTable(devFuncM); err == nil {
			// 自动补充func信息
			devModel := &models.SysDev{}
			devModel.Orm = db
			devList := make([]models.SysDev, 0)
			_ = devModel.FindList(&devList)
			productModel := &models.SysDevProduct{}
			productModel.Orm = db
			productList := make([]models.SysDevProduct, 0)
			_ = productModel.FindList(&productList)
			funcs := make([]models.SysDevFunc, 0)
			for _, dev := range devList {
				funcs = append(funcs, models.SysDevFunc{
					Id:         utils.SimpleUUID(),
					DevSn:      dev.Sn,
					Data:       []byte(constant.DevDefaultFuncTemplate),
					Schema:     []byte(constant.DevDefaultFuncSchemaTemplate),
					CreateTime: dev.CreateTime,
					UpdateTime: dev.CreateTime,
				})
			}
			for _, product := range productList {
				funcs = append(funcs, models.SysDevFunc{
					Id:           utils.SimpleUUID(),
					ProductModel: product.ProductModel,
					DevProductId: product.Id,
					Data:         []byte(constant.DevDefaultFuncTemplate),
					Schema:       []byte(constant.DevDefaultFuncSchemaTemplate),
					CreateTime:   product.CreateTime,
					UpdateTime:   product.CreateTime,
				})
			}
			devFuncM.Orm = db
			if err = devFuncM.Add(&funcs); err != nil {
				logger.Error(err)
			}
		}
	}

	if !db.Migrator().HasColumn(&models.SysDev{}, "protocol") {
		devM := &models.SysDev{}
		// 加dev protocol列
		_ = db.Migrator().AddColumn(devM, "protocol")
	}

	if !db.Migrator().HasTable(&models.SysProtocol{}) {
		_ = db.Migrator().CreateTable(&models.SysProtocol{})
	}

	if !db.Migrator().HasTable(&models.SysHistorySystem{}) {
		_ = db.Migrator().CreateTable(&models.SysHistorySystem{})
	}
}
